home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CAS_Win.c
-
- Contains: window-handling routines.
-
- Written by: David H Nelson
-
- Copyright © 1995 ComponentWorks, All rights reserved.
-
- Change History (most recent first):
- 01/14/95 DAS created this file
- */
-
- #include "CAS_ToolPalette.h"
-
- #include "CAS_App.h"
- #include "CAS_Win.h"
- #include "CAS_StringTools.h"
- #include "CAS_Menu.h"
-
-
- WindowPtr gToolPaletteW = nil;
- short gSelectedCell = (-1);
- Boolean gToolPaletteInitialized = false;
- PicHandle *gCellPicts = nil;
- short gCellPictsCount = 0;
-
-
- WindowPtr ToolPalette_Create(
- PicHandle *picsReference,
- short itemCount,
- short currentItem )
- {
- WindowPtr targetWindow;
- GrafPtr savedPort;
-
- GetPort( &savedPort );
-
- targetWindow = GetNewCWindow( WIND_ToolPalette, nil, (WindowPtr)(-1) );
- if (targetWindow != nil)
- {
- /* wedge the windowKind field so that the window can be identified as a floating window */
- Win_SetFloaterKind( targetWindow );
-
- if (gToolPaletteW == nil)
- gToolPaletteW = targetWindow;
-
- Win_ShowHide( targetWindow, true );
- gCellPicts = picsReference;
- gCellPictsCount = itemCount;
- gSelectedCell = currentItem;
- if (gSelectedCell >= gCellPictsCount)
- gSelectedCell = 0;
- }
-
- SetPort( savedPort );
-
- return targetWindow;
- }
-
-
- void ToolPalette_Dispose(
- WindowPtr targetWindow )
- {
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if (targetWindow != nil)
- {
- DisposeWindow( targetWindow );
- targetWindow = nil;
- }
-
- if (gToolPaletteW == targetWindow)
- gToolPaletteW = nil;
- gCellPicts = nil;
- gCellPictsCount = 0;
- gSelectedCell = (-1);
- }
-
-
- WindowPtr ToolPalette_GetWindow( void )
- {
- return gToolPaletteW;
- }
-
- void ToolPalette_Render(
- WindowPtr targetWindow )
- {
- Rect cellR;
- GrafPtr savedPort;
- short selectedCell, i;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if (targetWindow == nil)
- return;
-
- GetPort( &savedPort );
- SetPort( (GrafPtr)targetWindow );
-
- selectedCell = ToolPalette_GetSelectedCell( targetWindow );
- if (gCellPicts != nil)
- for (i=0; i<ToolPalette_CellCount; i++)
- if (gCellPicts[i] != nil)
- {
- ToolPalette_GetCellRect( targetWindow, i, &cellR );
- InsetRect( &cellR, 2, 2 );
- DrawPicture( gCellPicts[i], &cellR );
-
- if (i == selectedCell)
- ToolPalette_HighlightCell( targetWindow, i );
- }
-
- SetPort( savedPort );
- }
-
-
- Boolean ToolPalette_IsEvent(
- WindowPtr targetWindow,
- EventRecord *targetEvent )
- {
- WindowPtr eventWindow;
- short pressedWindowPart;
- Boolean ownsEvent;
- char theChar;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if ((targetEvent == nil) || !Win_IsVisible( targetWindow ))
- return false;
-
- ownsEvent = false;
- switch (targetEvent->what)
- {
- case mouseDown:
- case mouseUp:
- pressedWindowPart = FindWindow( targetEvent->where, &eventWindow );
- ownsEvent = (eventWindow == targetWindow);
- break;
-
- case activateEvt:
- case updateEvt:
- eventWindow = (WindowPtr)(targetEvent->message);
- ownsEvent = (eventWindow == targetWindow);
- break;
-
- case keyDown:
- case autoKey:
- if (targetWindow != FrontWindow())
- break;
-
- if (!(targetEvent->modifiers & cmdKey))
- ownsEvent = true;
- else
- {
- theChar = (char)(targetEvent->message & charCodeMask);
- ownsEvent = (MenuKey( theChar ) == 0L);
- }
- break;
-
- case osEvt: /* app4Evt in System 6 / Think 4.0 */
- ownsEvent = (((targetEvent->message >> 24) & 0x000000FF) == mouseMovedMessage);
- break;
-
- case diskEvt:
- default:
- break;
- }
-
- return ownsEvent;
- }
-
-
- Boolean ToolPalette_DoEvent(
- WindowPtr targetWindow,
- EventRecord *targetEvent )
- {
- WindowPtr eventWindow;
- GrafPtr savedPort;
- short theWindowPart, acceptedEvent;
- Boolean makeActive;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if ((targetEvent == nil) || !Win_IsVisible( targetWindow ))
- return false;
-
- acceptedEvent = false;
- switch (targetEvent->what)
- {
- case mouseDown:
- theWindowPart = FindWindow( targetEvent->where, &eventWindow );
- ToolPalette_DoMouseDownEvent( eventWindow, targetEvent, theWindowPart );
- acceptedEvent = (theWindowPart != 0);
- break;
-
- case activateEvt:
- makeActive = ((targetEvent->modifiers & activeFlag) != 0);
- if (makeActive)
- SetPort( (GrafPtr)targetWindow );
- acceptedEvent = true;
- break;
-
- case updateEvt:
- GetPort( &savedPort );
- SetPort( (GrafPtr)targetWindow );
- BeginUpdate( targetWindow );
- ToolPalette_Render( targetWindow );
- EndUpdate( targetWindow );
- SetPort( savedPort );
-
- acceptedEvent = true;
- break;
-
- case keyDown:
- case autoKey:
- acceptedEvent = false;
- break;
-
- default:
- break;
- }
-
- return acceptedEvent;
- }
-
-
- void ToolPalette_DoMouseDownEvent(
- WindowPtr targetWindow,
- EventRecord *targetEvent,
- short windowPart )
- {
- Rect dragBoundsR;
- Point curMouse;
- short curIndex, newIndex, origIndex;
- GrafPtr savedPort;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if (targetWindow == nil)
- return;
-
- GetPort( &savedPort );
- SetPort( (GrafPtr)targetWindow );
-
- switch (windowPart)
- {
- case inDrag:
- dragBoundsR = qd.screenBits.bounds;
- Win_DragWindow_Better( targetWindow, targetEvent->where, &dragBoundsR );
- break;
-
- case inContent:
- origIndex = ToolPalette_GetSelectedCell( targetWindow );
- curIndex = origIndex;
- while (WaitMouseUp())
- {
- GetMouse( &curMouse );
- newIndex = ToolPalette_PointToCellIndex( targetWindow, curMouse );
- if (!ToolPalette_ValidCellIndex( newIndex ))
- newIndex = origIndex;
-
- if (curIndex != newIndex)
- {
- curIndex = newIndex;
- ToolPalette_SetSelectedCell( targetWindow, curIndex );
- }
- }
-
- if (curIndex != origIndex)
- ToolPalette_DoCommand( targetWindow, curIndex );
- break;
-
- default:
- break;
- }
-
- SetPort( savedPort );
- }
-
-
- void ToolPalette_DoCommand(
- WindowPtr targetWindow,
- short cellIndex )
- {
- WindowPtr frontDocW;
- short menuCmdSelector;
-
- if (ToolPalette_ValidCellIndex( cellIndex ))
- {
- menuCmdSelector = cellIndex + 1;
- frontDocW = App_GetFrontDocWindow();
- App_HandleToolMenu( menuCmdSelector, frontDocW );
- Menu_AdjustMenus( frontDocW );
- }
- }
-
-
- short ToolPalette_GetSelectedCell(
- WindowPtr targetWindow )
- {
- return gSelectedCell;
- }
-
-
- void ToolPalette_SetSelectedCell(
- WindowPtr targetWindow,
- short newIndex )
- {
- GrafPtr savedPort;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
-
- if (ToolPalette_ValidCellIndex( newIndex ))
- if (gSelectedCell != newIndex)
- {
- if (targetWindow != nil)
- {
- GetPort( &savedPort );
- SetPort( (GrafPtr)targetWindow );
-
- ToolPalette_HighlightCell( targetWindow, gSelectedCell );
- ToolPalette_HighlightCell( targetWindow, newIndex );
-
- SetPort( savedPort );
- }
-
- gSelectedCell = newIndex;
- }
- }
-
-
- void ToolPalette_HighlightCell(
- WindowPtr targetWindow,
- short cellIndex )
- {
- PenState savedPenState;
- Rect cellR;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if ((targetWindow != nil) && ToolPalette_ValidCellIndex( cellIndex ))
- {
- ToolPalette_GetCellRect( targetWindow, cellIndex, &cellR );
-
- GetPenState( &savedPenState );
- PenNormal();
- PenMode( patXor | 50 );
- FrameRect( &cellR );
- SetPenState( &savedPenState );
- }
- }
-
-
- short ToolPalette_PointToCellIndex(
- WindowPtr targetWindow,
- Point location )
- {
- Rect cellR;
- short i;
-
- for (i=0; i<ToolPalette_CellCount; i++)
- {
- ToolPalette_GetCellRect( targetWindow, i, &cellR );
- if (PtInRect( location, &cellR ))
- return i;
- }
-
- return -1;
- }
-
-
- void ToolPalette_GetCellRect(
- WindowPtr targetWindow,
- short cellIndex,
- Rect *boundsR )
- {
- if (boundsR == nil)
- return;
-
- targetWindow = ToolPalette_VerifyWindow( targetWindow );
- if ((targetWindow == nil) || !ToolPalette_ValidCellIndex( cellIndex ))
- SetRect( boundsR, 0, 0, 0, 0 );
- else
- {
- SetRect( boundsR, 0, 0, ToolPalette_CellH, ToolPalette_CellV );
- OffsetRect( boundsR, 4 + cellIndex * ToolPalette_CellH, 4 );
- }
- }
-
-
- WindowPtr ToolPalette_VerifyWindow(
- WindowPtr targetWindow )
- {
- if (targetWindow == nil)
- targetWindow = gToolPaletteW;
-
- return targetWindow;
- }
-
-
- Boolean ToolPalette_ValidCellIndex(
- short cellIndex )
- {
- return ((cellIndex >= 0) && (cellIndex < ToolPalette_CellCount));
- }
-
-
-